% visualize_all_cases.m
% 批量生成所有案例的可视化图表

clear; clc; close all;

% 添加绘图函数路径
addpath('matlab_visualization');

% 定义所有案例
case_names = {
    'Conv_Case0',
    'Conv_Case1', 
    'FlashAttention_Case0',
    'FlashAttention_Case1',
    'Matmul_Case0',
    'Matmul_Case1'
};

fprintf('=== 批量可视化处理开始 ===\n');
fprintf('待处理案例数量: %d\n', length(case_names));
fprintf('=============================\n');

% 记录总体统计
total_success = 0;
total_failed = 0;
case_results = {};

for i = 1:length(case_names)
    case_name = case_names{i};
    
    fprintf('\n[%d/%d] 正在处理: %s\n', i, length(case_names), case_name);
    fprintf('----------------------------------------\n');
    
    try
        % 数据路径和输出路径
        data_dir = fullfile('build', 'output', 'visualizations', case_name);
        output_dir = fullfile('visualization_results', case_name);
        
        % 检查数据目录是否存在
        if ~exist(data_dir, 'dir')
            fprintf('   ⚠ 跳过: 数据目录不存在 %s\n', data_dir);
            fprintf('   提示: 请先运行该案例的C++程序\n');
            case_results{end+1} = sprintf('%s: 数据缺失', case_name);
            total_failed = total_failed + 1;
            continue;
        end
        
        % 创建输出目录
        if ~exist(output_dir, 'dir')
            mkdir(output_dir);
        end
        
        fprintf('   数据目录: %s\n', data_dir);
        fprintf('   输出目录: %s\n', output_dir);
        
        % 统计可用的数据文件
        files_to_check = {
            [case_name '_pareto_solutions.csv'],
            [case_name '_convergence_history.csv'],
            [case_name '_memory_usage_stats.csv'],
            [case_name '_memory_allocation_history.csv'],
            [case_name '_buffer_lifetimes.csv']
        };
        
        available_files = 0;
        for j = 1:length(files_to_check)
            if exist(fullfile(data_dir, files_to_check{j}), 'file')
                available_files = available_files + 1;
            end
        end
        
        fprintf('   可用数据文件: %d/%d\n', available_files, length(files_to_check));
        
        if available_files == 0
            fprintf('   ✗ 跳过: 没有找到任何数据文件\n');
            case_results{end+1} = sprintf('%s: 无数据文件', case_name);
            total_failed = total_failed + 1;
            continue;
        end
        
        % 生成可视化图表
        plots_generated = 0;
        
        % 1. 帕累托前沿图
        pareto_file = fullfile(data_dir, [case_name '_pareto_solutions.csv']);
        if exist(pareto_file, 'file')
            try
                plot_pareto_front_from_csv(pareto_file, output_dir, case_name);
                plots_generated = plots_generated + 1;
                fprintf('     ✓ 帕累托前沿图\n');
            catch
                fprintf('     ✗ 帕累托前沿图失败\n');
            end
        end
        
        % 2. 收敛曲线
        conv_file = fullfile(data_dir, [case_name '_convergence_history.csv']);
        if exist(conv_file, 'file')
            try
                plot_convergence_from_csv(conv_file, output_dir, case_name);
                plots_generated = plots_generated + 1;
                fprintf('     ✓ 收敛曲线\n');
            catch
                fprintf('     ✗ 收敛曲线失败\n');
            end
        end
        
        % 3. 内存使用统计图
        stats_file = fullfile(data_dir, [case_name '_memory_usage_stats.csv']);
        if exist(stats_file, 'file')
            try
                plot_memory_stats_from_csv(stats_file, output_dir, case_name);
                plots_generated = plots_generated + 1;
                fprintf('     ✓ 内存使用统计图\n');
            catch
                fprintf('     ✗ 内存使用统计图失败\n');
            end
        end
        
        % 4. 内存分配甘特图 (可选，因为数据量大可能很慢)
        alloc_file = fullfile(data_dir, [case_name '_memory_allocation_history.csv']);
        if exist(alloc_file, 'file')
            try
                fprintf('     正在生成内存甘特图 (可能较慢)...\n');
                plot_memory_gantt_from_csv(alloc_file, output_dir, case_name);
                plots_generated = plots_generated + 1;
                fprintf('     ✓ 内存甘特图\n');
            catch
                fprintf('     ✗ 内存甘特图失败\n');
            end
        end
        
        % 5. Buffer生命周期图 (可选，因为数据量大可能很慢)
        lifetime_file = fullfile(data_dir, [case_name '_buffer_lifetimes.csv']);
        if exist(lifetime_file, 'file')
            try
                fprintf('     正在生成Buffer生命周期图 (可能较慢)...\n');
                plot_buffer_lifetimes_from_csv(lifetime_file, output_dir, case_name);
                plots_generated = plots_generated + 1;
                fprintf('     ✓ Buffer生命周期图\n');
            catch
                fprintf('     ✗ Buffer生命周期图失败\n');
            end
        end
        
        fprintf('   生成图表数量: %d\n', plots_generated);
        
        if plots_generated > 0
            fprintf('   ✓ %s 处理成功\n', case_name);
            case_results{end+1} = sprintf('%s: %d个图表', case_name, plots_generated);
            total_success = total_success + 1;
        else
            fprintf('   ✗ %s 处理失败\n', case_name);
            case_results{end+1} = sprintf('%s: 生成失败', case_name);
            total_failed = total_failed + 1;
        end
        
    catch ME
        fprintf('   ✗ %s 处理出错: %s\n', case_name, ME.message);
        case_results{end+1} = sprintf('%s: 错误', case_name);
        total_failed = total_failed + 1;
    end
end

% 显示总结报告
fprintf('\n=============================\n');
fprintf('=== 批量可视化处理完成 ===\n');
fprintf('=============================\n');
fprintf('成功处理: %d 个案例\n', total_success);
fprintf('失败跳过: %d 个案例\n', total_failed);
fprintf('总计案例: %d\n', length(case_names));
fprintf('=============================\n');

fprintf('\n处理结果详情:\n');
for i = 1:length(case_results)
    fprintf('  %s\n', case_results{i});
end

fprintf('\n所有可视化结果保存在: visualization_results/ 目录下\n');

% 打开结果目录
if ispc && exist('visualization_results', 'dir')
    winopen('visualization_results');
end

fprintf('\n批量可视化处理结束！\n');

